package com.ruoyi.controller;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.region.Region;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

@RestController
@RequestMapping("/app/upload")
@Slf4j
public class UploadController {

    @Value("${tencent.cos.secretId}")
    private String cosSecretId;
    @Value("${tencent.cos.secretKey}")
    private String cosSecretKey;
    @Value("${tencent.cos.region}")
    private String cosRegion;
    @Value("${tencent.cos.bucket}")
    private String cosBucket;
    // 可选：自定义访问域名前缀，如 CDN 域名或网站反代地址
    @Value("${tencent.cos.baseUrl}")
    private String cosBaseUrl;


    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception
    {
        try
        {
            String key = putCosAndReturnKey(file);
            String url = buildCosUrl(key);
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", url);
            ajax.put("newFileName", FileUtils.getName(key));
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 将文件上传到 COS 并返回对象键（key）
     */
    private String putCosAndReturnKey(MultipartFile file) throws Exception {
        if (StringUtils.isEmpty(cosSecretId) || StringUtils.isEmpty(cosSecretKey)
                || StringUtils.isEmpty(cosRegion) || StringUtils.isEmpty(cosBucket)) {
            throw new IllegalStateException("COS配置未完成，请在application.yml中配置 tencent.cos.secretId/secretKey/region/bucket");
        }
        COSCredentials cred = new BasicCOSCredentials(cosSecretId, cosSecretKey);
        ClientConfig clientConfig = new ClientConfig(new Region(cosRegion));
        clientConfig.setHttpProtocol(HttpProtocol.https);
        COSClient cosClient = new COSClient(cred, clientConfig);
        try {
            String original = file.getOriginalFilename();
            String suffix = "";
            if (StringUtils.isNotEmpty(original) && original.lastIndexOf('.') >= 0) {
                suffix = original.substring(original.lastIndexOf('.'));
            }
            String key = "upload/" + DateUtils.datePath() + "/" + UUID.randomUUID().toString().replace("-", "") + suffix;
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            metadata.setContentType(file.getContentType());
            PutObjectRequest putObjectRequest = new PutObjectRequest(cosBucket, key, file.getInputStream(), metadata);
            cosClient.putObject(putObjectRequest);
            return key;
        } finally {
            cosClient.shutdown();
        }
    }

    /**
     * 根据对象键构建可访问的URL
     */
    private String buildCosUrl(String key) {
        if (StringUtils.isNotEmpty(cosBaseUrl)) {
            //https://cloud-test.yunxiangfarm.cn/upload/2025/10/17/62db2d7505e5436baf196f3a1b4e542e.jpg
            // 获取key中的最后 /的后面的值
            String fileName = key.substring(key.lastIndexOf("/") + 1);

            // 生成一个16位的uuid
            String uuid = UUID.randomUUID().toString().replace("-", "");
            return cosBaseUrl.endsWith("/") ? cosBaseUrl + key : (cosBaseUrl + "/" + key);
        }
        return String.format("https://%s.cos.%s.myqcloud.com/%s", cosBucket, cosRegion, key);
    }
}
